
import java.net.InetAddress;

import jpcap.*;
import jpcap.packet.EthernetPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.TCPPacket;

class SendTCP {

    public static void main(String[] args) throws java.io.IOException {
//        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
//        if (args.length < 1) {
//            System.out.println("Usage: java SentTCP <device index (e.g., 0, 1..)>");
//            for (int i = 0; i < devices.length; i++) {
//                System.out.println(i + ":" + devices[i].name + "(" + devices[i].description + ")");
//            }
//            System.exit(0);
//        }
//        int index = Integer.parseInt(args[0]);
//        JpcapSender sender = JpcapSender.openDevice(devices[index]);
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        JpcapSender sender = JpcapSender.openDevice(devices[0]);

        //TCPPacket(int src_port, int dst_port, long sequence, long ack_num,
        //   boolean urg, boolean ack, boolean psh, boolean rst, boolean syn, boolean fin,
        //   boolean rsv1, boolean rsv2, int window, int urgent)
        TCPPacket p = new TCPPacket(12, 34, 56, 78,
                false, false, false, false, true, true,
                true, true, 10, 10);

        //setIPv4Parameter(int priority, boolean d_flag, boolean t_flag, boolean r_flag,
        //   int rsv_tos, boolean rsv_frag, boolean dont_frag, boolean more_frag,
        //   int offset, int ident, int ttl, int protocol,
        //   java.net.InetAddress src,
        //   java.net.InetAddress dst)
        p.setIPv4Parameter(0, false, false, false, // utowrzenie pakietu IP
                0, false, false, false,
                0, 1010101, 100, IPPacket.IPPROTO_TCP,
                InetAddress.getByName("173.1.1.1"),
                InetAddress.getByName("192.12.1.103"));

        p.data = ("data").getBytes(); // dane pakietu TCP

        // utowrzenie ramki Ethernetowej
        // ustawienie typu ramki Ethernetowej (dla IP)
        // ustawienie adresu MAC zrodla - 48 bit
        // ustawienie adresu MAC celu
        EthernetPacket ether = new EthernetPacket();
        ether.frametype = EthernetPacket.ETHERTYPE_IP;
        ether.src_mac = new byte[]{Integer.decode("0x1f").byteValue(),   // adres MAC zrodla
                                   Integer.decode("0x0f").byteValue(),
                                   Integer.decode("0x0f").byteValue(),
                                   Integer.decode("0x0f").byteValue(),
                                   Integer.decode("0x0f").byteValue(),
                                   Integer.decode("0x0f").byteValue()};
        ether.dst_mac = new byte[]{Integer.decode("0x00").byteValue(),   // adres MAC przeznaczenia
                                   Integer.decode("0x13").byteValue(),
                                   Integer.decode("0xe8").byteValue(),
                                   Integer.decode("0x16").byteValue(),
                                   Integer.decode("0x46").byteValue(),
                                   Integer.decode("0xb3").byteValue()};

        p.datalink = ether;   // ustawineie wartstwy lacza danych

        for (int i = 0; i < 10; i++) // wyslaenie 10 pakietow
        {
            sender.sendPacket(p);
        }
    }
}
